package com.gxc.string;

import com.sun.xml.internal.ws.server.ServerRtException;

import java.util.*;

/**
 * 题目描述
 * 告警抑制，是指高优先级告警抑制低优先级告警的规则。高优先级告警产生后，低优先级告警不再产生。请根据原始告警列表和告警抑制关系，给出实际产生的告警列表。
 *
 * 不会出现循环抑制的情况。
 * 告警不会传递，比如A->B,B->C，这种情况下A不会直接抑制C。但被抑制的告警仍然可以抑制其他低优先级告警。
 * 输入描述
 * 第一行为数字N，表示告警抑制关系个数，0 ≤ N ≤ 120
 * 接下来N行，每行是由空格分隔的两个告警ID，例如: id1 id2，表示id1抑制id2，告警ID的格式为：
 *
 * 大写字母+0个或者1个数字
 *
 * 最后一行为告警产生列表，列表长度[1,100]
 *
 * 输出描述
 * 真实产生的告警列表
 */
public class Alarm {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = java.lang.Integer.parseInt(scanner.nextLine());

        Map<String, Set<String>> controlMap = new HashMap<>();
        for (int i = 0; i < n; i++) {
            String str = scanner.nextLine();
            String[] split = str.split(" ");
            controlMap.computeIfAbsent(split[1], v -> new HashSet<>()).add(split[0]);
        }

        String str = scanner.nextLine();
        String[] split = str.split(" ");
        Set<String> s = new HashSet<>();
        for (int i = 0; i < split.length; i++) {
            s.add(split[i]);
        }

        List<String> res = new ArrayList<>();
        for (int i = 0; i < split.length; i++) {
            String c = split[i];
            Set<String> set = controlMap.getOrDefault(c, new HashSet<>());
            if (set.isEmpty()) {
                res.add(c);
                continue;
            }

            boolean flag = true;
            for (String string : set) {
                if (s.contains(string)) {
                    flag = false;
                    break;
                }
            }
            if (flag) res.add(c);
        }

        for (int i = 0; i < res.size(); i++) {
            System.out.print(res.get(i));
            if (i != res.size() - 1) System.out.print(" ");
        }
    }
}
